package org.dayatang.dddlib.event.api;

import java.lang.reflect.ParameterizedType;

/**
 * 抽象事件处理器
 * @param <T> 事件类型
 */
public abstract class AbstractEventListener<T extends Event> implements EventListener<T> {

    @Override
    public void onEvent(T event) {
        if (!supports(event)) {
            return;
        }
        handle((T) event);
    }

    //判断是否监听指定的事件类型
    private boolean supports(Event event) {
        ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
        Class<?> eventClass = (Class<?>) parameterizedType.getActualTypeArguments()[0];
        //System.out.println("Event class is: " + eventClass);
        return eventClass.isAssignableFrom(event.getClass());
    }

    /**
     * 处理事件
     * @param event 要处理的事件
     */
    public abstract void handle(T event);
}
